/*     */ package dm.jdbc.driver;
/*     */ 
/*     */ import dm.jdbc.dbaccess.DBError;
/*     */ import java.math.BigDecimal;
/*     */ import java.sql.SQLException;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class DmdbNumeric
/*     */ {
/*     */   private static final int XDEC_TEMPBUF_SIZE = 21;
/*     */   private static final int XDEC_POSITIVE = 193;
/*     */   private static final int XDEC_NEGTIVE = 62;
/*     */   private static final int XDEC_NEGTIVE_NUM = 101;
/*     */   private static final int XDEC_SIGN_POSITIVE = 1;
/*     */   private static final int XDEC_SIGN_NEGTIVE = 0;
/*  19 */   private int n = 0;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*  24 */   private int m = 0;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*  30 */   private int m_sign = 1;
/*  31 */   private int m_exp = 0;
/*  32 */   private String m_strInt = null;
/*  33 */   private String m_strDec = null;
/*  34 */   private int m_max_len = 38;
/*     */   
/*     */   private String checkStr(String strOrg, int prec, int scale) throws SQLException
/*     */   {
/*  38 */     String str = null;
/*     */     try {
/*  40 */       BigDecimal bgd = new BigDecimal(strOrg);
/*  41 */       str = bgd.toString();
/*     */       
/*  43 */       if ((prec != 0) || (scale != 0)) {
/*  44 */         BigDecimal bgd2 = bgd.setScale(scale, 4);
/*  45 */         str = bgd2.toString();
/*     */         
/*  47 */         this.m_max_len = prec;
/*     */       }
/*     */     }
/*     */     catch (NumberFormatException ex) {
/*  51 */       DBError.throwSQLException(6007);
/*     */     }
/*     */     
/*  54 */     return str;
/*     */   }
/*     */   
/*     */   private String setSign(String strOrg) {
/*  58 */     this.m_sign = 1;
/*     */     
/*  60 */     if (strOrg.startsWith("-")) {
/*  61 */       this.m_sign = 0;
/*  62 */       return strOrg.substring(1);
/*     */     }
/*  64 */     if (strOrg.startsWith("+")) {
/*  65 */       this.m_sign = 1;
/*  66 */       return strOrg.substring(1);
/*     */     }
/*     */     
/*  69 */     return strOrg;
/*     */   }
/*     */   
/*     */   private String rmvUnnecessaryZeros(String strOrg) {
/*  73 */     int zeroStartIndex = 0;
/*  74 */     while ((zeroStartIndex < strOrg.length()) && 
/*  75 */       ('0' == strOrg.charAt(zeroStartIndex))) {
/*  76 */       zeroStartIndex++;
/*     */     }
/*  78 */     int pIndex = strOrg.substring(zeroStartIndex).indexOf('.');
/*  79 */     int zeroEndIndex = strOrg.length() - 1;
/*  80 */     while ((-1 != pIndex) && ('0' == strOrg.charAt(zeroEndIndex)) && (
/*  81 */       zeroEndIndex >= 0)) {
/*  82 */       zeroEndIndex--;
/*     */     }
/*  84 */     if (-1 != pIndex) {
/*  85 */       return strOrg.substring(zeroStartIndex, zeroEndIndex + 1);
/*     */     }
/*  87 */     return strOrg.substring(zeroStartIndex);
/*     */   }
/*     */   
/*     */   private void setDecInt(String strRet) {
/*  91 */     int pIndex = strRet.indexOf('.');
/*  92 */     if (pIndex == 0) {
/*  93 */       this.m_strInt = null;
/*  94 */       if (1 == strRet.length()) {
/*  95 */         this.m_strDec = null;
/*     */       } else
/*  97 */         this.m_strDec = strRet.substring(1);
/*  98 */     } else if ((-1 == pIndex) || (strRet.length() - 1 == pIndex)) {
/*  99 */       this.m_strDec = null;
/* 100 */       if (-1 == pIndex) {
/* 101 */         this.m_strInt = strRet;
/*     */       } else
/* 103 */         this.m_strInt = strRet.substring(0, strRet.length() - 1);
/*     */     } else {
/* 105 */       this.m_strInt = strRet.substring(0, pIndex);
/* 106 */       this.m_strDec = strRet.substring(pIndex + 1);
/*     */     }
/*     */   }
/*     */   
/*     */   private boolean checkZero(String strRet) {
/* 111 */     BigDecimal big = new BigDecimal(strRet);
/* 112 */     BigDecimal zero = new BigDecimal(0.0D);
/* 113 */     if (big.compareTo(zero) == 0) {
/* 114 */       return true;
/*     */     }
/* 116 */     return false;
/*     */   }
/*     */   
/*     */   private int cntZeroEnd(String strInt) {
/* 120 */     int end = strInt.length() - 1;
/*     */     
/* 122 */     while ((end >= 0) && ('0' == strInt.charAt(end))) {
/* 123 */       end--;
/*     */     }
/*     */     
/* 126 */     return strInt.length() - 1 - end;
/*     */   }
/*     */   
/*     */   private int cntZeroStart(String strDec) {
/* 130 */     int start = 0;
/*     */     
/* 132 */     while ((start < strDec.length()) && ('0' == strDec.charAt(start))) {
/* 133 */       start++;
/*     */     }
/* 135 */     return start;
/*     */   }
/*     */   
/*     */   private byte[] processStrInt() {
/* 139 */     if (this.m_strInt == null) {
/* 140 */       return null;
/*     */     }
/* 142 */     int strLen = this.m_strInt.length();
/* 143 */     int sub = 0;
/*     */     
/* 145 */     int start = 0;
/* 146 */     int btCnt = strLen / 2;
/* 147 */     if (strLen % 2 != 0)
/* 148 */       btCnt++;
/* 149 */     byte[] temp = new byte[btCnt];
/*     */     
/* 151 */     boolean bOdd = false;
/* 152 */     if (strLen % 2 != 0) {
/* 153 */       sub = Integer.parseInt(this.m_strInt.substring(0, 1), 10);
/* 154 */       if (this.m_sign == 1) {
/* 155 */         temp[start] = ((byte)(sub + 1));
/*     */       } else {
/* 157 */         temp[start] = ((byte)(101 - sub));
/*     */       }
/* 159 */       start++;
/*     */       
/* 161 */       bOdd = true;
/*     */     }
/* 164 */     for (; 
/* 164 */         start < btCnt; start++) {
/* 165 */       if (bOdd) {
/* 166 */         sub = Integer.parseInt(this.m_strInt.substring(start * 2 - 1, 
/* 167 */           start * 2 + 1 <= strLen ? start * 2 + 1 : strLen), 10);
/*     */       } else {
/* 169 */         sub = Integer.parseInt(this.m_strInt.substring(start * 2, 
/* 170 */           start * 2 + 2 < strLen ? start * 2 + 2 : strLen), 10);
/*     */       }
/* 172 */       if (this.m_sign == 1) {
/* 173 */         temp[start] = ((byte)(sub + 1));
/*     */       } else {
/* 175 */         temp[start] = ((byte)(101 - sub));
/*     */       }
/*     */     }
/* 178 */     return temp;
/*     */   }
/*     */   
/*     */   private byte[] processStrDec() {
/* 182 */     if (this.m_strDec == null) {
/* 183 */       return null;
/*     */     }
/* 185 */     int strLen = this.m_strDec.length();
/* 186 */     int sub = 0;
/*     */     
/* 188 */     if (strLen % 2 != 0) {
/* 189 */       this.m_strDec += "0";
/* 190 */       strLen = this.m_strDec.length();
/*     */     }
/*     */     
/* 193 */     int btCnt = strLen / 2;
/* 194 */     byte[] temp = new byte[btCnt];
/*     */     
/* 196 */     for (int start = 0; start < btCnt; start++) {
/* 197 */       sub = Integer.parseInt(this.m_strDec.substring(start * 2, 
/* 198 */         start * 2 + 2 > strLen ? strLen : start * 2 + 2), 10);
/*     */       
/* 200 */       if (this.m_sign == 1) {
/* 201 */         temp[start] = ((byte)(sub + 1));
/*     */       } else {
/* 203 */         temp[start] = ((byte)(101 - sub));
/*     */       }
/*     */     }
/* 206 */     return temp;
/*     */   }
/*     */   
/*     */   private byte fixFlag() throws SQLException {
/* 210 */     byte bt = 0;
/*     */     
/*     */ 
/* 213 */     if (this.m_sign == 1) {
/* 214 */       bt = (byte)(193 + this.m_exp / 2);
/*     */     } else {
/* 216 */       bt = (byte)(62 - this.m_exp / 2);
/*     */     }
/* 218 */     return bt;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private byte[] fixDec(byte flag, byte[] btBefore, byte[] btAfter)
/*     */     throws SQLException
/*     */   {
/* 228 */     int len = 0;
/* 229 */     byte[] temp = new byte[21];
/* 230 */     temp[0] = flag;
/* 231 */     len++;
/* 232 */     if (btBefore != null) {
/* 233 */       byte[] btBefTmp = null;
/* 234 */       if (btBefore.length > 21 - len) {
/* 235 */         btBefTmp = new byte[Math.abs(21 - len)];
/* 236 */         System.arraycopy(btBefore, 0, btBefTmp, 0, btBefTmp.length);
/*     */       } else {
/* 238 */         btBefTmp = btBefore;
/*     */       }
/*     */       
/* 241 */       System.arraycopy(btBefTmp, 0, temp, len, btBefTmp.length);
/* 242 */       len += btBefTmp.length;
/*     */     }
/*     */     
/* 245 */     if (btAfter != null) {
/* 246 */       byte[] btAftTmp = null;
/* 247 */       if (btAfter.length > 21 - len) {
/* 248 */         btAftTmp = new byte[Math.abs(21 - len)];
/* 249 */         System.arraycopy(btAfter, 0, btAftTmp, 0, btAftTmp.length);
/*     */       }
/*     */       else {
/* 252 */         btAftTmp = btAfter;
/*     */       }
/*     */       
/* 255 */       System.arraycopy(btAftTmp, 0, temp, len, btAftTmp.length);
/* 256 */       len += btAftTmp.length;
/*     */     }
/*     */     
/* 259 */     if ((this.m_sign == 0) && (len < 20)) {
/* 260 */       temp[(len++)] = 102;
/*     */     }
/* 262 */     if (len < 20) {
/* 263 */       temp[len] = 0;
/*     */     }
/* 265 */     byte[] Ret = new byte[len];
/* 266 */     System.arraycopy(temp, 0, Ret, 0, len);
/* 267 */     return Ret;
/*     */   }
/*     */   
/*     */   private byte[] fixZero() {
/* 271 */     byte[] ret = new byte[1];
/* 272 */     ret[0] = Byte.MIN_VALUE;
/* 273 */     return ret;
/*     */   }
/*     */   
/*     */   private String setExp(String strOrg) {
/* 277 */     int eIndex = strOrg.indexOf('e');
/* 278 */     if (-1 == eIndex) {
/* 279 */       eIndex = strOrg.indexOf('E');
/*     */     }
/* 281 */     if (-1 == eIndex) {
/* 282 */       this.m_exp = 0;
/* 283 */       return strOrg;
/*     */     }
/* 285 */     String strExp = strOrg.substring(eIndex + 1);
/* 286 */     int n = strExp.indexOf('+');
/* 287 */     if (-1 != n) {
/* 288 */       strExp = strExp.substring(n + 1);
/*     */     }
/* 290 */     this.m_exp = Integer.parseInt(strExp, 10);
/*     */     
/* 292 */     return strOrg.substring(0, eIndex);
/*     */   }
/*     */   
/*     */   private void checkOverFlow() throws SQLException
/*     */   {
/* 297 */     if ((this.m_exp > 123) || (this.m_exp < -128))
/* 298 */       DBError.throwSQLException(63034);
/*     */   }
/*     */   
/*     */   private void processExp() {
/* 302 */     if (this.m_exp % 2 == 0) {
/* 303 */       return;
/*     */     }
/* 305 */     String strDec = this.m_strDec;
/* 306 */     String strInt = this.m_strInt;
/*     */     
/*     */ 
/* 309 */     if ((strInt == null) && (strDec != null)) {
/* 310 */       if (strDec.startsWith("0")) {
/* 311 */         this.m_strDec = this.m_strDec.substring(1);
/*     */       } else {
/* 313 */         this.m_strInt = this.m_strDec.substring(0, 1);
/* 314 */         this.m_strDec = this.m_strDec.substring(1);
/*     */       }
/*     */       
/*     */ 
/*     */     }
/* 319 */     else if ((strInt != null) && (strDec == null)) {
/* 320 */       this.m_strInt += "0";
/*     */ 
/*     */     }
/*     */     else
/*     */     {
/* 325 */       this.m_strInt += this.m_strDec.substring(0, 1);
/* 326 */       this.m_strDec = this.m_strDec.substring(1);
/*     */     }
/*     */     
/* 329 */     this.m_exp -= 1;
/*     */     
/*     */ 
/* 332 */     if (this.m_strInt != null) {
/* 333 */       this.m_strInt = rmvUnnecessaryZeros(this.m_strInt);
/*     */     }
/* 335 */     if (this.m_strDec != null)
/* 336 */       this.m_strDec = rmvUnnecessaryZeros("." + this.m_strDec).substring(1);
/*     */   }
/*     */   
/*     */   private void setMN() {
/* 340 */     String strInt = this.m_strInt;
/* 341 */     String strDec = this.m_strDec;
/*     */     
/*     */ 
/* 344 */     if ((strInt != null) && (strDec == null)) {
/* 345 */       this.n = this.m_strInt.length();
/* 346 */       this.m = cntZeroEnd(this.m_strInt);
/*     */       
/*     */ 
/* 349 */       if (this.m % 2 != 0) {
/* 350 */         this.m -= 1;
/*     */       }
/* 352 */       this.m_exp += this.m;
/* 353 */       this.m_strInt = this.m_strInt.substring(0, this.n - this.m);
/*     */       
/* 355 */       this.n = this.m_strInt.length();
/* 356 */       if (this.n % 2 != 0) {
/* 357 */         this.n += 1;
/*     */       }
/* 359 */       this.m_exp += this.n - 2;
/*     */ 
/*     */ 
/*     */     }
/* 363 */     else if ((strInt == null) && (strDec != null)) {
/* 364 */       this.n = strDec.length();
/* 365 */       this.m = cntZeroStart(strDec);
/*     */       
/*     */ 
/* 368 */       if (this.m % 2 != 0) {
/* 369 */         this.m -= 1;
/*     */       }
/* 371 */       this.m_exp -= this.m;
/*     */       
/* 373 */       if (this.n - this.m < 2) {
/* 374 */         strDec = strDec + "0";
/*     */       }
/*     */       
/* 377 */       this.m_strInt = strDec.substring(this.m, this.m + 2);
/* 378 */       this.m_strDec = strDec.substring(this.m + 2);
/* 379 */       this.m_exp -= 2;
/*     */       
/* 381 */       if (this.m_strInt.startsWith("0")) {
/* 382 */         this.m_strInt = this.m_strInt.substring(1);
/*     */       }
/*     */     }
/*     */     else
/*     */     {
/* 387 */       this.n = strInt.length();
/*     */       
/* 389 */       if (this.n % 2 != 0) {
/* 390 */         this.n += 1;
/*     */       }
/* 392 */       this.m_exp += this.n - 2;
/*     */     }
/*     */   }
/*     */   
/*     */   private void checkMaxLen() throws SQLException {
/* 397 */     int iLen = this.m_strInt == null ? 0 : this.m_strInt.length();
/*     */     
/*     */ 
/* 400 */     if (iLen > this.m_max_len)
/* 401 */       DBError.throwSQLException(63034);
/*     */   }
/*     */   
/*     */   public byte[] StrToDec(String str, int prec, int scal) throws SQLException {
/* 405 */     str = str.trim();
/* 406 */     str = checkStr(str, prec, scal);
/*     */     
/* 408 */     if (checkZero(str)) {
/* 409 */       return fixZero();
/*     */     }
/* 411 */     str = setExp(str);
/* 412 */     str = setSign(str);
/*     */     
/* 414 */     String strRet = rmvUnnecessaryZeros(str);
/*     */     
/* 416 */     setDecInt(strRet);
/*     */     
/*     */ 
/* 419 */     processExp();
/*     */     
/*     */ 
/* 422 */     setMN();
/*     */     
/* 424 */     checkMaxLen();
/*     */     
/* 426 */     checkOverFlow();
/*     */     
/* 428 */     return fixDec(fixFlag(), processStrInt(), processStrDec());
/*     */   }
/*     */   
/*     */   public String decToString(byte[] arr) throws SQLException {
/* 432 */     int length = arr.length;
/* 433 */     boolean sign = true;
/* 434 */     short dec_head = 0;
/* 435 */     byte exp = 0;
/* 436 */     int zeros = 0;
/* 437 */     int bits = 0;
/* 438 */     boolean bigger = true;
/*     */     
/* 440 */     if ((arr.length == 0) || (arr.length > 21)) {
/* 441 */       DBError.throwSQLException(20004);
/*     */     }
/* 443 */     if ((arr[0] == Byte.MIN_VALUE) || (arr.length == 1)) {
/* 444 */       return "0";
/*     */     }
/* 446 */     StringBuffer str = new StringBuffer();
/* 447 */     StringBuffer strtmp = new StringBuffer();
/*     */     
/* 449 */     if (arr[0] < 0) {
/* 450 */       dec_head = (short)(arr[0] + 256);
/*     */     } else {
/* 452 */       dec_head = arr[0];
/*     */     }
/* 454 */     if ((arr[0] & 0x80) == 128) {
/* 455 */       sign = true;
/*     */     } else {
/* 457 */       sign = false;
/*     */     }
/* 459 */     if (sign) {
/* 460 */       exp = (byte)(dec_head - 193);
/*     */     } else {
/* 462 */       exp = (byte)(62 - dec_head);
/*     */     }
/* 464 */     while (length > 0) {
/* 465 */       if (arr[(length - 1)] != 0) break;
/* 466 */       length--;
/*     */     }
/*     */     
/*     */ 
/*     */ 
/* 471 */     for (int i = 1; i < length; i++) {
/* 472 */       if (sign) {
/* 473 */         if ((arr[i] - 1 < 10) && (i != 1))
/* 474 */           strtmp.append("0");
/* 475 */         strtmp.append(arr[i] - 1);
/*     */       }
/* 477 */       else if (arr[i] != 102) {
/* 478 */         if ((101 - arr[i] < 10) && (i != 1))
/* 479 */           strtmp.append("0");
/* 480 */         strtmp.append(101 - arr[i]);
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 485 */     if ((sign) && (arr[1] - 1 < 10)) {
/* 486 */       bigger = false;
/* 487 */     } else if ((!sign) && (101 - arr[1] < 10)) {
/* 488 */       bigger = false;
/*     */     }
/* 490 */     if (exp > 0) {
/* 491 */       if (bigger) {
/* 492 */         bits = exp * 2 + 2;
/*     */       } else {
/* 494 */         bits = exp * 2 + 1;
/*     */       }
/* 496 */       if (bits > strtmp.length()) {
/* 497 */         zeros = bits - strtmp.length();
/* 498 */         for (int i = 0; i < zeros; i++)
/* 499 */           strtmp.append("0");
/* 500 */       } else if (bits < strtmp.length()) {
/* 501 */         strtmp.insert(bits, '.');
/*     */       }
/* 503 */     } else if (exp == 0) {
/* 504 */       if (strtmp.length() > 2) {
/* 505 */         if (bigger) {
/* 506 */           strtmp.insert(2, '.');
/*     */         } else
/* 508 */           strtmp.insert(1, '.');
/*     */       }
/*     */     } else {
/* 511 */       exp = (byte)(exp * -1);
/*     */       
/* 513 */       if (bigger) {
/* 514 */         zeros = exp * 2 - 2;
/*     */       } else {
/* 516 */         zeros = exp * 2 - 1;
/*     */       }
/* 518 */       strtmp.insert(0, "0.");
/* 519 */       for (int i = 0; i < zeros; i++) {
/* 520 */         strtmp.insert(2, "0");
/*     */       }
/*     */       
/* 523 */       strtmp = new StringBuffer(rmvUnnecessaryZeros(strtmp.substring(0, 
/* 524 */         strtmp.length())));
/*     */       
/* 526 */       strtmp.insert(0, "0");
/*     */     }
/*     */     
/*     */ 
/* 530 */     boolean dotFind = false;
/* 531 */     if (strtmp.indexOf(".") > 0) {
/* 532 */       while ((strtmp.charAt(strtmp.length() - 1) == '0') || 
/* 533 */         (strtmp.charAt(strtmp.length() - 1) == '.'))
/*     */       {
/* 535 */         if (strtmp.charAt(strtmp.length() - 1) == '.') {
/* 536 */           dotFind = true;
/*     */         }
/* 538 */         strtmp.deleteCharAt(strtmp.length() - 1);
/*     */         
/*     */ 
/* 541 */         if (dotFind)
/*     */           break;
/*     */       }
/*     */     }
/* 545 */     if (!sign) {
/* 546 */       str.append("-");
/*     */     }
/* 548 */     str.append(strtmp.toString());
/* 549 */     return str.toString();
/*     */   }
/*     */ }


/* Location:              D:\Program Files\DBMS_20150813\jdbc\Dm7JdbcDriver17.jar!\dm\jdbc\driver\DmdbNumeric.class
 * Java compiler version: 2 (46.0)
 * JD-Core Version:       0.7.1
 */